//Main.cc

#include<iostream>
#include<vector>
#include<unistd.h>
#include<cstdio>
#include"Thread.hpp"
#include"LockGuard.hpp"

using namespace gwj;

int tickets=10000;
pthread_mutex_t gmutex=PTHREAD_MUTEX_INITIALIZER;

// void route(ThreadData* td)
// {
//     while(true)
//     {
//         pthread_mutex_lock(td->_lock);
//         if(tickets>0)
//         {
//             //抢票
//             usleep(1000); //抢票花费的时间:1ms
//             printf("who: %s,get a ticket:%d\n",td->_name.c_str(),tickets);
//             tickets--;
//             pthread_mutex_unlock(td->_lock);  
//         }
//         else
//         {
//             pthread_mutex_unlock(td->_lock);  
//             break;
//         }
//     }
// }

// void route(ThreadData* td)
// {
//     std::cout<<td->_name<<": "<<"mutex address: "<<td->_lock<<std::endl;    
// }

void route(ThreadData* td)
{
    while(true)
    {
        LockGuard lockguard(td->_lock);   //调用构造函数，自动加锁，当循环结束，临时对象被释放，调用析构函数
        if(tickets>0)
        {
            //抢票
            usleep(1000); //抢票花费的时间:1ms
            printf("who: %s,get a ticket:%d\n",td->_name.c_str(),tickets);
            tickets--;

        }
        else
        {
            break;
        }
    }
}

static int threadnum=4;

int main()
{
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex,nullptr);

    std::vector<Thread> threads;
    for(int i=0;i<threadnum;i++)
    {
        std::string name="thread-"+std::to_string(i+1);
        ThreadData *td=new ThreadData(name,&mutex);
        threads.emplace_back(name,route,td);
    }

    for(auto &thread:threads)
    {
        thread.Start();
    }

        for(auto &thread:threads)
    {
        thread.Join();
    }

    pthread_mutex_destroy(&mutex);

    return 0;
}

// int main()
// {
//     Thread t1("thread-1",route);
//     Thread t2("thread-2",route);
//     Thread t3("thread-3",route);
//     Thread t4("thread-4",route);

//     t1.Start();
//     t2.Start();
//     t3.Start();
//     t4.Start();

//     t1.Join();
//     t2.Join();
//     t3.Join();
//     t4.Join();

// }

// void Print(const std::string &name)
// {
//     int cnt=1;
//     while(true)
//     {
//         std::cout<<name<<" is running,cnt: "<<cnt++<<std::endl;
//         sleep(1);
        
//     }
// }

// const int gnum=10;

// int main()
// {
//         //构建
//     std::vector<Thread> threads;
//     for(int i=0;i<gnum;i++)
//     {
//         std::string name="thread-"+std::to_string(i+1);
//         threads.emplace_back(name,Print);
//         sleep(1);
//     }

//     for(auto &thread:threads)
//     {
//         thread.Start();
//     }

//     for(auto &thread:threads)
//     {
//         thread.Stop();
//     }

//     //等待
//     for(auto &thread:threads)
//     {
//         thread.Join();
//     }

//     // Thread t("thread-1",Print);

//     // t.Start();
//     // std::cout<<t.Name()<<t.Status()<<std::endl;
//     // sleep(10);
//     // std::cout<<t.Name()<<t.Status()<<std::endl;

//     // t.Stop();
//     // sleep(1);
//     // std::cout<<t.Name()<<t.Status()<<std::endl;

//     // t.Join();
//     // std::cout<<"join done"<<std::endl;

//     return 0;
// }